package main

import "fmt"

/**
编写一个算法来判断一个数是不是“快乐数”。

一个“快乐数”定义为：对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和，然后重复这个过程直到这个数变为 1，也可能是无限循环但始终变不到 1。如果可以变为 1，那么这个数就是快乐数。

示例:

输入: 19
输出: true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
*/

/**
循环进行sum=x*x+y*y
循环跳出的条件是sum==1,或sum出现之前出现过的数

https://blog.csdn.net/DERRANTCM/article/details/47997637
*/
func main() {
	fmt.Println(isHappy(2))
}

func isHappy(n int) bool {
	if n <= 0 {
		return false
	}

	hashmap := make(map[int]int)
	//循环判断是否当前n为1 或 之前已出现过
	for n != 1 && !mapexist(hashmap, n) {
		hashmap[n] = 1
		tmp := 0
		for n != 0 {
			lastnum := n % 10
			tmp += lastnum * lastnum
			n /= 10
		}
		n = tmp
	}

	if n == 1 {
		return true
	} else {
		return false
	}
}

func mapexist(hashmap map[int]int, key int) bool {
	if _, ok := hashmap[key]; ok {
		return true
	} else {
		return false
	}
}

//func isHappy(n int) bool {
//	if n <= 0 {
//		return false
//	}
//
//	mapset := make(map[int]int)
//	for n != 1 && !mapexist(mapset, n) {
//		mapset[n] = 1
//		sum := 0
//		for n != 0 {
//			lastnum := n % 10
//			sum += lastnum * lastnum
//			n /= 10
//		}
//		n = sum
//	}
//
//	if n == 1 {
//		return true
//	} else {
//		return false
//	}
//}
//
//func mapexist(mapset map[int]int, key int) bool {
//	if _, ok := mapset[key]; ok {
//		return true
//	} else {
//		return false
//	}
//}
